/**
 * 系统通知
 * 系统通知分为两种
 *  内建系统通知
 *   目前所有的内建系统通知都是与高级群相关的通知, 某些群操作后相关的群成员会收到相应的系统通知。
 *   内建系统通知与群通知消息的区别是系统通知是发给单人的通知, 群通知消息是发给所有群成员的消息。
 *  自定义系统通知
 *   开发者可以向其他用户或群发送自定义系统通知
 *   自定义系统通知和自定义消息的区别如下
 *   自定义消息属于消息, 会存储在云信的消息数据库中, 需要跟其他消息一同展现给用户。
 *   自定义系统通知属于系统通知, 用于第三方通知自己, 不会存储在云信的数据库中, SDK不会解析这些通知, SDK仅仅负责传递这些通知。
 * 请参考初始化SDK时传入的onofflinesysmsgs、onofflinecustomsysmsgs、onsysmsg、oncustomsysmsg等回调。
 */
export interface ISystemMessage {
  /* 内建系统通知的 idServer */
  _id: string;
  /** 发送时间戳 */
  time?: number;
  /** 系统通知类型 */
  type: ISystemMessageType;
  /* 系统通知的来源, 账号或者群ID */
  from: string;
  /* 系统通知的目标, 账号或者群ID */
  to: string;
  /* 内建系统通知是否已读 */
  read: boolean;
  /* 内建系统通知的种类 */
  category: 'team' | 'friend';
  /* 内建系统通知的state */
  state: string;
  /* 内建系统通知的state 为 'error' 时, 此字段包含错误的信息 */
  error: object;
  /* 内建系统通知的本地自定义扩展字段 */
  localCustom: string;
  /* 内建系统通知的附言 */
  ps: string;
  /*
   * 内建系统通知的附加信息, 参考系统通知类型来查看不同类型的系统通知对应的附加信息
   * custom	String	<optional> 附加消息的扩展字段, 可能没有
   */
  attach?: object;
  /* 附加消息的扩展字段, 可能没有 */
  custom: string;
  /* 自定义系系统通知的场景, 参考消息场景 */
  scene: string;
  /* 自定义系统通知的内容 */
  content: string;
  /* 是否需要推送 */
  isPushable: boolean;
  /* 自定义系统通知的推送文案, 仅对接收方为iOS设备有效 */
  apnsText: string;
  /* 自定义系统通知的推送属性 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是被其它端丢弃 */
  pushPayload: string;
  /* 是否需要推送昵称 */
  needPushNick: boolean;
  /*
   * 自定义系统通知是否只发送给在线用户。
   * true时只发送给在线用户, 适合发送即时通知, 比如正在输入。
   * false时假如目标用户或群不在线, 会在其上线后推送过去。
   * 该参数只对点对点自定义系统通知有效, 对群自定义系统通知无效, 群自定义系统通知只会发给在线的群成员, 不会存离线。
   */
  sendToOnlineUsersOnly: boolean;
  /* 自定义系统通知是否抄送 */
  cc: boolean;
}

export type ISystemMessageType = keyof typeof ISystemMessageTypeEnum;

export enum ISystemMessageTypeEnum {
  'custom' = '自定义系统通知',
  /**
   * 撤回消息后, 消息接收方会收到一条类型为'deleteMsg'的系统通知, 此类系统通知的 msg 为被删除的消息的部分字段。如果是群消息, 那么群里的所有人都会收到这条系统通知. 如果同时在多个端登录了同一个账号, 那么其它端也会收到这条系统通知.
   */
  'deleteMsg' = '撤回消息',
  'addFriend' = '添加好友',
  'applyFriend' = '好友申请通过',
  'passFriendApply' = '忽略好友申请',
  'rejectFriendApply' = '拒绝好友申请',
  'deleteFriend' = '删除好友',
  /*
   * 高级群的群主和管理员在邀请成员加入群（通过操作创建群或拉人入群）之后, 被邀请的人会收到一条类型为'teamInvite'的系统通知, 此类系统通知的from字段的值为邀请方的帐号, to字段的值为对应的群ID, 此类系统通知的attach有一个字段team的值为被邀请进入的群, 被邀请的人可以选择接受邀请或者拒绝邀请。
   *  如果接受入群邀请, 那么该群的所有群成员会收到一条类型为'acceptTeamInvite'的群通知消息, 此类群通知消息的from字段的值为接受入群邀请的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段members的值为接收入群邀请的群成员列表。
   *  如果拒绝入群邀请, 那么邀请你的人会收到一条类型为'rejectTeamInvite'的系统通知, 此类系统通知的from字段的值为拒绝入群邀请的人的帐号, to字段的值为对应的群ID。
   * @see http://dev.yunxin.163.com/docs/interface/%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AFWeb%E7%AB%AF/NIMSDK-Web/SystemMessage.html#.type
   */
  'teamInvite' = '邀请进群',
}

export interface ISysMsgUnRead {
  /* 总共的未读数 */
  total?: number;
  /* 所有跟好友相关的系统通知的未读数 */
  friend?: number;
  /* 直接加为好友的未读数 */
  addFriend?: number;
  /* 申请加为好友的未读数 */
  applyFriend?: number;
  /* 通过好友申请的未读数 */
  passFriendApply?: number;
  /* 拒绝好友申请的未读数 */
  rejectFriendApply?: number;
  /* 删除好友的未读数 */
  deleteFriend?: number;
  /* 所有跟群相关的系统通知的未读数 */
  team?: number;
  /* 入群邀请的未读数 */
  teamInvite?: number;
  /* 接受入群邀请的未读数 */
  rejectTeamInvite?: number;
  /* 入群申请的未读数 */
  applyTeam?: number;
  /* 拒绝入群申请的未读数 */
  rejectTeamApply?: number;
}
